
/*
 * File: vfsdriver.c
 *
 * Description: This is a driver program for testing your VFS system using an interaction script as input
 * You need to make additional calls to your respective functions as noted in the comments below
 * Make sure the output you display is exactly as per the given specifications for you. Do NOT print
 * any extra output (like debug messages) in the final version of your driver program. You can use this driver program
 * in a in incremental manner as you keep implementing one operator after another. For operators not yet implemented,
 * you can leave the output as given ("TO_BE_DONE"). So you can use this program as your "main" program for testing purposes.
 *
 * DO NOT write the full code for operators in the driver program! You must only CALL your functions from here.
 *
 * Usage: vfsdriver <scriptfilename>
 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "../include/MainHeader.h"
#include "../include/errorcodes.h"

#define BUFSIZE 200
#define CMDSIZE 30
#define PARSIZE 100

void createvfs ( char *P1, int P2 );
void mountvfs ( char *P1 );
void unmountvfs ( char *P1 );
void makedir ( char *P1, char *P2 );
void deletedir ( char *P1 );
void movedir ( char *P1, char *P2 );
void listdir ( char *P1, int P2, char *P3 );
void addfile ( char *P1, char *P2, char *P3 );
void listfile ( char *P1, char *P2 );
void updatefile ( char *P1, char *P2 );
void removefile ( char *P1 );
void movefile ( char *P1, char *P2 );
void copyfile ( char *P1, char *P2 );
void exportfile ( char *P1, char *P2 );
void searchfile ( char *P1, char *P2 );

void processcommand( char *command, char *P1, char *P2, char *P3 );

int main( int argc, char *argv[] )
{
	FILE *scriptfp;
	char linebuffer[BUFSIZE];
	char command[CMDSIZE], par1[PARSIZE], par2[PARSIZE], par3[PARSIZE];
	char *token;

	if( argc != 2 ){
		fprintf(stderr,"Usage: vfsdriver <scriptfile>\n");
		return(1);
	}

	if( (scriptfp=fopen(argv[1],"r")) == NULL ){
		fprintf(stderr,"Unable to open script file: %s\n", argv[1]);
		return(2);
	}

	while( fgets(linebuffer, sizeof(linebuffer), scriptfp) != NULL ){
		/* This output is for debugging... do not uncomment in final version */
		/*
		printf("==================================================\n");
		printf("Processing: %s", linebuffer);
		printf("==================================================\n");
		*/

		/* Remove the extra newline character in the end of line */
		linebuffer[ strlen(linebuffer)-1 ] = '\0';
		
		/* Get the command and the parameters using tokenizer */
		strcpy( command, (token = strtok(linebuffer, " ")) == NULL ? "" : token );
		
		strcpy( par1, (token = strtok(NULL, " ")) == NULL ? "" : token );
		strcpy( par2, (token = strtok(NULL, " ")) == NULL ? "" : token );
		strcpy( par3, (token = strtok(NULL, " ")) == NULL ? "" : token );
		/* printf("Command:%s:p1:%s:p2:%s:p3:%s\n",command, par1, par2, par3); */

		processcommand( command, par1, par2, par3 );
	}
}

void processcommand( char *command, char *P1, char *P2, char *P3 )
{
	if( strcmp(command, "createvfs") == 0 ){
		
		//char c=(char)size;
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("createvfs_FAILURE %s\n",ERR_VFS_CREATE_00);
		else
			{int size = atoi(P2);
			createvfs (P1,size);}
		
	}
	else if( strcmp(command, "mountvfs") == 0 )
	{
		if(strcmp(P1,"")==0)
			printf("mountvfs_FAILURE %s \n",ERR_VFS_CREATE_00);
		else
			mountvfs (P1);
	}	
	else if( strcmp(command, "unmountvfs") == 0 )
	{
		if(strcmp(P1,"")==0)
			printf("unmountvfs_FAILURE %s\n",ERR_VFS_CREATE_00);
		else
			unmountvfs (P1);
	}	
	else if( strcmp(command, "makedir") == 0 )
	{	
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("makedir_FAILURE %s\n",ERR_VFS_CREATE_00);
		else
			makedir (P1,P2);
	}	
	else if( strcmp(command, "deletedir") == 0 )
	{
		if(strcmp(P1,"")==0)
			printf("deletedir_FAILURE %s\n",ERR_VFS_CREATE_00);
		else
			deletedir (P1);
	}	
	else if( strcmp(command, "movedir") == 0 )
	{	
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("movedir_FAILURE %s\n",ERR_VFS_CREATE_00);
		else	
		movedir (P1,P2);
	}	
	else if( strcmp(command, "listdir") == 0 ){

	//	printf("in driver =P1=%s\nP2=%s\nP3=%s\n",P1,P2,P3 );			
		if(strcmp(P1,"")==0 || strcmp(P3,"")==0 || strcmp(P2,"")==0)
			printf("listdir_FAILURE %s \n",ERR_VFS_CREATE_00);
		else
		{	int flag = atoi(P2);
			listdir (P1,flag,P3);
		}	
		
	}
	else if( strcmp(command, "addfile") == 0 )
	{	
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0 || strcmp(P3,"")==0)
			printf("addfile_FAILURE %s\n",ERR_VFS_CREATE_00);
		else		
		addfile (P1,P2,P3);

	}	
	else if( strcmp(command, "listfile") == 0 )
	{   
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("listfile_FAILURE %s\n",ERR_VFS_CREATE_00);
		else
			listfile (P1,P2);

	}	
	else if( strcmp(command, "updatefile") == 0 )
	{	
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("updatefile_FAILURE %s\n",ERR_VFS_CREATE_00);
		else	
			updatefile (P1,P2);
	}	
	else if( strcmp(command, "removefile") == 0 )
	{
		if(strcmp(P1,"")==0)
			printf("removefile_FAILURE %s\n",ERR_VFS_CREATE_00);
		else	
			removefile (P1);
	}	
	else if( strcmp(command, "movefile") == 0 )
	{	
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("movefile_FAILURE %s\n",ERR_VFS_CREATE_00);
		else		
			movefile (P1,P2);
	}	
	else if( strcmp(command, "copyfile") == 0 )
	{	
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("copyfile_FAILURE %s\n",ERR_VFS_CREATE_00);
		else		
		copyfile (P1,P2);
	}	
	else if( strcmp(command, "exportfile") == 0 )
	{	
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("exportfile_FAILURE %s\n",ERR_VFS_CREATE_00);
		else		
		exportfile (P1,P2);
	}	
	else if( strcmp(command, "searchfile") == 0 )
	{	
		if(strcmp(P1,"")==0 || strcmp(P2,"")==0)
			printf("searchfile_FAILURE %s\n",ERR_VFS_CREATE_00);
		else	
			searchfile (P1,P2);
	}	
	else
		printf("Ignoring invalid command %s\n", command);
}

void createvfs ( char *P1, int P2 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */
	
	int i=create_Vfs(P1,P2);
	//printf("\nValue of i in driver=%d\n",i);

	if(i==1)
		printf("createvfs_FAILURE %s\n",ERR_VFS_CREATE_01);
	else if(i==2)
		printf("createvfs_FAILURE %s\n",ERR_VFS_CREATE_02);
	else if(i==3)
		printf("createvfs_FAILURE %s\n",ERR_VFS_CREATE_03);
	else if(i==4)		
		printf("createvfs_FAILURE %s\n",ERR_VFS_CREATE_04);
	else if (i==5)
		printf("createvfs_FAILURE %s\n",ERR_VFS_CREATE_05);
	else
		printf("createvfs_SUCCESS\n");
	

}

void mountvfs ( char *P1 )
{

	
	/* Call the appropriate function with given arguments and display appropriate output on the screen */
	


	int i=mountVfs(P1);

	if(i==1)
		printf("mountvfs_FAILURE %s\n",ERR_VFS_MOUNT_01);
	else if(i==2)
		printf("mountvfs_FAILURE %s\n",ERR_VFS_MOUNT_02);
	else if(i==3)
		printf("mountvfs_FAILURE %s\n",ERR_VFS_MOUNT_03);
	else if(i==0)
		printf("mountvfs_SUCCESS\n");

}

void unmountvfs ( char *P1 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */

		
		int i=unmount_vfs(P1);
		//printf("ismounted=%d",ismounted);
		 if(i==1)
			printf("unmountvfs_FAILURE %s\n",ERR_VFS_UNMOUNT_01);
		else if(i==3)
			printf("unmountvfs_FAILURE %s\n",ERR_VFS_UNMOUNT_03);
		else if(i==2)
			printf("unmountvfs_FAILURE %s\n",ERR_VFS_UNMOUNT_02);
		else if(i==4)
			printf("unmountvfs_FAILURE %s\n",ERR_VFS_MAKEDIR_05);
		else if(i==0)
			printf("unmountvfs_SUCCESS\n");

	
}



void makedir ( char *P1, char *P2 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */

	if(ismounted==0)
		printf("makedir_FAILURE %s\n", ERR_VFS_MAKEDIR_05);
	else
	{
		if(lastcharcheck(P1) == 1){
			P1 = extrctslash(P1);
		}

		int i=create_dir(P1,P2);
		if(i==1)
			printf("makedir_FAILURE %s \n", ERR_VFS_MAKEDIR_01);		
		else if(i==2)
			printf("makedir_FAILURE %s \n", ERR_VFS_MAKEDIR_02);
		else if(i==3)
			printf("makedir_FAILURE %s \n", ERR_VFS_MAKEDIR_03);	 
		else if(i==0)
			printf("makedir_SUCCESS\n");
	}
}

void deletedir ( char *P1 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */

	//"VFS_NOT_MOUNTED"
	//"VFS_INSUFFICIENT_ARGUMENTS"
	

	if(ismounted==0)
		printf("deletedir_FAILURE %s \n", ERR_VFS_DELETEDIR_04);
	else
		{	
			P1= extrctslash(P1);
			int i=delete_dir(&naryRoot,P1);

			if(i==1)
				printf("deletedir_FAILURE %s\n",ERR_VFS_DELETEDIR_01);
				
			else if(i==2)
				printf("deletedir_FAILURE %s\n",ERR_VFS_DELETEDIR_02);
			
			else if(i==0)
				printf("deletedir_SUCCESS\n");	
		}	
			
}


void movedir ( char *P1, char *P2 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */


	//"VFS_NOT_MOUNTED"
	//"VFS_INSUFFICIENT_ARGUMENTS"
	if(ismounted==0)
		printf("movedir_FAILURE %s  \n", ERR_VFS_MOVEDIR_08);
	else
		{	

			P1= extrctslash(P1);
			P2= extrctslash(P2);
			int i=0;
			//int i=move_dir(&naryRoot,P1,P2);
			if(i==1)
				printf("movedir_FAILURE %s\n",ERR_VFS_MOVEDIR_04);
				
			else if(i==2)
				printf("movedir_FAILURE %s\n",ERR_VFS_MOVEDIR_01);
			else if(i==3)
				printf("movedir_FAILURE %s\n",ERR_VFS_MOVEDIR_07);
			else if(i==4)
				printf("movedir_FAILURE %s\n",ERR_VFS_MOVEDIR_02);		 
			else if(i==5)
				printf("movedir_FAILURE %s\n",ERR_VFS_MOVEDIR_06);
			else if(i==6)
				printf("movedir_FAILURE %s\n",ERR_VFS_MOVEDIR_05);		 
			else if(i==0)
				printf("movedir_SUCCESS\n");
			
		}	


}

void listdir ( char *P1, int P2, char *P3 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */\

	if(ismounted==0)
		printf("listdir_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
		{

			P1= extrctslash(P1);
			int i=list_dir(&naryRoot,P1,P2,P3);

			//"VFS_NOT_MOUNTED"
			//"VFS_INSUFFICIENT_ARGUMENTS"

			if(i==1)
				printf("listdir_FAILURE %s\n",ERR_VFS_LISTDIR_02);
				
			else if(i==2)
				printf("listdir_FAILURE %s \n",ERR_VFS_LISTDIR_01);
			else if(i==3)
				printf("listdir_FAILURE %s\n",ERR_VFS_LISTDIR_04);
			else if(i==0)
				printf("listdir_SUCCESS\n");

		}			
	
}

void addfile ( char *P1, char *P2, char *P3 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */


	if(ismounted==0)
		printf("ADDFILE_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
	{
		if(strcmp(P1,"/")!=0)
		{
			if(lastcharcheck(P1) == 1)
			{
				P1 = extrctslash(P1);
			}
		}

		add_file(P1,P2,P3);
		//testfunc();
	}		
	//printf("addfile_SUCCESS\n");
}

void listfile ( char *P1, char *P2 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */

	if(ismounted==0)
		printf("listfile_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
	{
		if(lastcharcheck(P1) == 1)
			P1 = extrctslash(P1);

		list_file(P1,P2);	
	}
	//printf("listfile_SUCCESS\n");
}

void updatefile ( char *P1, char *P2 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */

	if(ismounted==0)
		printf("updatefile_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
	{
		if(lastcharcheck(P1) == 1)
			P1 = extrctslash(P1);

		int i=update_file (P1,P2);
	}
	//printf("return of i=%d",i);
	/*if(i==1)
		printf("\n updatefile_FAILURE< %s > \n",  ERR_VFS_UPDATEFILE_01);
	else if(i==2)
		printf("\n updatefile_FAILURE < %s > \n",  ERR_VFS_UPDATEFILE_02);
	else if(i==3)
		printf("\n updatefile_FAILURE < %s > \n",  ERR_VFS_UPDATEFILE_03);
	else if(i==4)
		printf("\n updatefile_FAILURE < %s > \n",  ERR_VFS_UPDATEFILE_04);
	else if(i==0)
		printf("updatefile_SUCCESS\n");*/
}

void removefile ( char *P1 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */

	if(ismounted==0)
		printf("removefile_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
	{
		if(lastcharcheck(P1) == 1)
			P1 = extrctslash(P1);

		remove_file(P1);
	}
	//printf("removefile_TO_BE_DONE\n");
}

void movefile ( char *P1, char *P2 )
{

	if(ismounted==0)
		printf("movefile_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
	{
		if(lastcharcheck(P1) == 1)
			P1 = extrctslash(P1);
		if(lastcharcheck(P2) == 1)
			P2 = extrctslash(P2);

		move_file(P1,P2);
	}	
	/* Call the appropriate function with given arguments and display appropriate output on the screen */
	//printf("movefile_TO_BE_DONE\n");
}

void copyfile ( char *P1, char *P2 )
{

	/* Call the appropriate function with given arguments and display appropriate output on the screen */
	//
	if(ismounted==0)
		printf("copyfile_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
	{
		if(lastcharcheck(P1) == 1)
			P1 = extrctslash(P1);
		if(lastcharcheck(P2) == 1)
			P2 = extrctslash(P2);

		copyFile(P1, P2);
	}
//printf("copyfile_TO_BE_DONE\n");
}

void exportfile ( char *P1, char *P2 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */

	if(ismounted==0)
		printf("exportfile_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
	{
		if(lastcharcheck(P1) == 1)
			P1 = extrctslash(P1);

		int i=export_file(P1,P2);

		if(i==1)
			printf("exportfile_FAILURE %s \n", ERR_VFS_EXPORTFILE_01);
		else if(i==2)
			printf("exportfile_FAILURE %s \n", ERR_VFS_EXPORTFILE_02);
		else if(i==3)
			printf("exportfile_FAILURE %s \n", ERR_VFS_EXPORTFILE_03);	 
		else if(i==6)
			printf("exportfile_FAILURE %s\n",ERR_VFS_MOVEDIR_08 );
		else if(i==0)
			printf("exportfile_SUCCESS\n");

	}
	

}

void searchfile ( char *P1, char *P2 )
{
	/* Call the appropriate function with given arguments and display appropriate output on the screen */

	if(ismounted==0)
		printf("\n searchfile_FAILURE %s \n", ERR_VFS_MOVEDIR_08);
	else
	{
		hashPrefixSearch(hash,P1,P2);
	}
	//printf("searchfile_SUCCESS\n");
}


